/**
  四、迭代器iterator
  概念：Iterator迭代器是一种接口，为不同数据类型结构提供统一访问机制。任何数据类型值只要
        部署Iterator接口，就可以完成遍历操作。
  1）ES6创造了一种新的便利名利for...of循环，iterator接口主要提供for...of消费。
  2）原生具备iterator接口的数据（可用for...of）
  a)Array
  b)Arguments
  c)Set
  d)Map
  e)string
  f)TypedArray
  g)NodeList
  2、工作原理 
    1）创建一个指针对象，指向当前数据结构的起始位置。
    2）第一次调用next方法，指针自动只想数据结构第一个成员。
    3）接下来不断调用next方法，指针一直往后移，直到只想最后一个成员。
    4）每次调用next方法返回一个对象{value:"...",done:"..."}。
*/
const arr = ['时间简史', '借我一生', '文化苦旅', '山居笔记', '行者无疆', '千年一叹']
const iterator = arr[Symbol.iterator]()
console.log('iterator:', iterator)
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
/**
 * 2、自定义遍历数组
 */
const className = {
    name: "一般",
    status: ['时间简史', '借我一生', '文化苦旅', '山居笔记', '行者无疆', '千年一叹'],
    [Symbol.iterator]() {
        let index = 0, _this = this
        return {
            next: function () {
                if (index < _this.status.length) {
                    const result = { value: _this.status[index], done: false }
                    index++
                    return result;
                } else {
                    return { value: undefined, done: true }
                }
            }
        }
    }
}

for (const key of className) {
    console.log("key:", key) //报错： className is not iterable
}

/**
  3、生成器函数：做异步编程使用
    (1)、做异步编程使用，纯函数调用。
    (2)、yield做分隔符，产生几块代码结果。（3个yield产生4块代码块。）
    (3)、next参数做为上一个返回结果使用
 */

